from books.models import HeroInfo
from heros.serialziers import HeroSerializer
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView


# Create your views here.
class HerosView(GenericAPIView):
    # 指定查询集属性 查询对应的模型类数据
    queryset = HeroInfo.objects.all()
    # 指定序列化器
    serializer_class = HeroSerializer

    def get(self, request):
        """
            获取所有英雄
        :param request:
        :return:
        """
        # 查询所有英雄  self.get_queryset()可以获取queryset属性的数据
        heros = self.get_queryset()
        # 构造返回数据 self.get_serializer 获取serializer_class属性所指定的序列化器 将初始化参数传递到方法中
        ser = self.get_serializer(heros, many=True)
        return Response(ser.data)

    def post(self, request):
        """
            保存英雄
        :param request:
        :return:
        """
        # 获取数据 request.data获取的json是转化后的字典数据
        data_dict = request.data
        # 验证数据
        ser = self.get_serializer(data=data_dict)
        try:
            ser.is_valid(raise_exception=True)
        except:
            return Response({'errors': ser.errors}, status=400)
        # 保存数据
        ser.save()
        # 返回结果
        return Response(ser.data)


class HeroView(GenericAPIView):
    # 指定查询集属性 查询对应的模型类数据
    queryset = HeroInfo.objects.all()
    # 指定序列化器
    serializer_class = HeroSerializer

    def get(self, request, pk):

        # 获取单一数据对象 self.get_object()可以根据pk对应的id值自动从queryset指定的查询集获取到对应id的数据队形
        hero = self.get_object()

        ser = self.get_serializer(hero)
        return Response(ser.data)

    def put(self, request, pk):
        # 获取单一数据对象 self.get_object()可以根据pk对应的id值自动从queryset指定的查询集获取到对应id的数据队形
        hero = self.get_object()
        # 获取数据
        data_dict = request.data
        ser = self.get_serializer(hero, data=data_dict)
        try:
            ser.is_valid(raise_exception=True)
        except:
            return Response({'errors': ser.errors}, status=400)
        # 更新
        ser.save()
        return Response(ser.data)

    def delete(self, request, pk):
        # 获取单一数据对象 self.get_object()可以根据pk对应的id值自动从queryset指定的查询集获取到对应id的数据队形
        hero = self.get_object()

        hero.is_delete = True
        hero.save()
        return Response({})
